WebSockets Vulnerability
WebSockets Nedir?
Modern web sitelerinde, bağlantılarını http üzerinden başlatan, çift yönlü iletişim protokolüdür(Layer7). HTTP istek yapar ve cevap alır websockets protokolü ise devamlı bir bağlantı sağlayarak httpdeki istek ve cevap arasında yaşanan beklemeler yüzünden kesintiler yaşanmaz. Örnek verelim bir görüntülü konuşmada her şey anlıktır istek cevap süresi yoktur veya bir borsa da crypto fiyat takibi yaparken veriler sürekli gelir bir istek cevap yoktur devamlı bir bağlantı sağlar.
İstemci aşağıdaki gibi bir WebSocket el sıkışma isteği gönderir:
GET /chat HTTP/1.1
Host: xx.alperencoskun.com
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: vcOuKtsiLcJhhYihL4Pc9wB==
Connection: keep-alive, Upgrade
Cookie: session= nvbYF9tEijeE2PTsEJNuasw4Rd9BPNr8
Upgrade: websocket
Sunucu bağlantıyı kabul ederse, aşağıdaki gibi bir WebSocket el sıkışma yanıtı döndürür:
HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Accept: 0FFP+8ThFIf/h+2VP85f1uzrYSk=
WebSockets Vulnerability Nedir Nasıl Test Edilir?
WebSockets protokolü doğru yapılandırılmadığı zaman aslında bir çok açığa kapı açar. Bunlar arasında doğrulama zafiyetleri, sniffing saldırıları, iletileri değiştirme (xss, sql vs.), csrf gibi bir çok zafiyete sebep olabilir. Ayrıca istemci ile sunucu arasında devamlı bir bağlantı bulunması sunucunun daha fazla efor sarfetmesine neden olduğundan Dos açıklarını da beraberinde getirir.
Bunları daha iyi anlamak için PortSwigger labaratuvarından birkaç örnek ile açıklayalım.
Burada açılan mağza sayfasında canlı destek ile iletişime geçmemiz gerektiğini ve mesajları manipüle ederek xss çalıştırmamız istenmiş. Access the lab dedikten sonra Live chat seçeneğine tıklıyoruz.
Yukarıda WebSockets bağlantısı oluşması için bir mesaj yazıyoruz ve bağlantı kuruyoruz.
İkinici mesajda yukarıdaki gibi websockets paketi görüyoruz. Biz burada bir manipüle kodu ekleyeceğiz.
Burada mesaj kısmında kod çalıştırmayı deniyoruz. Bu kısımda websockets bağlantısının kopmaması için hazırda kodumuz bulunması gerekiyor . Yukarıdaki gibi paketi yolladığımızda manipüle etmiş oluyoruz.
Bununla ilgili farklı bir labını çözelim.
Burada bize yine bir xss zafiyeti yapacağımızı fakat kusurlu bir filitreye sahip olduğunu söylüyor.
Aynı şekilde lab a bağlandıktan sonra Live Chat diyoruz ve bir mesaj yazarak websockets bağlantısını başlatmış oluyoruz.
Şekildeki gibi tekrar bir kod yollamaya çalıştığımızda filitreleme bizi engelliyor ve sayfaya giriş yapamıyoruz.
Bloklandık fakat bunu da manipüle edebileceğim. BurpSuite paket yakalamayı başlattıktan sonra tekrar Live Chat e basıyorum ve her paketin altına aşağıdaki gibi yazıyoruz.
Yukarıdaki gibi paketi gördüğümüzde manipüle etmiş oluyoruz ve aşağıdaki gibi chat in tekrar başladığını görüyoruz.
Sohbet başladığı için tekrar kod göndermeyi deneyebilirim
Şimdi filitrelemeye takılmamak için büyük küçük harfe karşı duyarlılığı var mı onu test edeceğiz ve kodumuz aşağıdaki gibi olacak:
{"message":"<img src=x oNeRrOr=alert`allsafe`>"}
Bu şekilde gönderdiğimizde başarılı olduk.
Bu labaratuvardaki asıl nokta
X-Forwarded-For: 1.1.1.1 ile ip taklidi yaparak el sıkışma işlemini gerçekleştirmemiz ve teste devam etmemizdi.
Peki Gerçek Web Sitelerinde Labaratuvarlardaki Gibi Çıkar Mı?
Evet mümkün, labaratuvarda gördüklerimiz dışında örneğin bi kodu çeşitli encoding yöntemiyle göndermeyi deneyebiliriz. CSRF saldırıları ,sql sorguları gibi bir çok saldırı yöntemini test edebiliriz.
Birkaç Örnek WebSockets Vulnerability Raporları
https://hackerone.com/reports/535436
https://hackerone.com/reports/470003
https://hackerone.com/reports/409701